package com.sen.common.utils;

import org.apache.commons.lang.StringUtils;

/**
 * 对ip进行的操作类.
 * 
 * @author sen
 */
public final class IpAddressUtils {

	private IpAddressUtils() {
		// empty
	}

	/**
	 * 把字符串型的ip地址转化为long型的(32位).
	 * 
	 * @param ipAddr
	 *            字符串型的ip.
	 * @return long型的ip地址.
	 */
	public static long convertToLong(String ipAddr) {
		if (StringUtils.isBlank(ipAddr)) {
			return 0;
		}
		long[] ip = new long[4];
		//先找到IP地址字符串中.的位置  
		int position1 = ipAddr.indexOf(".");
		int position2 = ipAddr.indexOf(".", position1 + 1);
		int position3 = ipAddr.indexOf(".", position2 + 1);
		//将每个.之间的字符串转换成整型  
		ip[0] = Long.parseLong(ipAddr.substring(0, position1));
		ip[1] = Long.parseLong(ipAddr.substring(position1 + 1, position2));
		ip[2] = Long.parseLong(ipAddr.substring(position2 + 1, position3));
		ip[3] = Long.parseLong(ipAddr.substring(position3 + 1));
		return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
	}

	/**
	 * 把long型的ip地址反为long型的(32位).
	 * 
	 * @param ipAddr
	 *            字符串型的ip.
	 * @return long型的ip地址.
	 */
	public static String recoverFromLong(long ipAddr) {
		StringBuffer sb = new StringBuffer(15);
		//直接右移24位  
		sb.append(String.valueOf((ipAddr >>> 24)));
		sb.append(".");
		//将高8位置0，然后右移16位  
		sb.append(String.valueOf((ipAddr & 0x00FFFFFF) >>> 16));
		sb.append(".");
		//将高16位置0，然后右移8位  
		sb.append(String.valueOf((ipAddr & 0x0000FFFF) >>> 8));
		sb.append(".");
		//将高24位置0  
		sb.append(String.valueOf((ipAddr & 0x000000FF)));
		return sb.toString();
	}
}
